package com.quanz.ckgl.tools;

import java.util.Date;

import org.joda.time.DateTime;

/**
 * 用于实现dwr/json传递的查询条件定义，javascript端通过使用不同的属性名称来设置不同类型的值数据，
 * 解决javascript中无法直接指定值数据类型问题
 * 
 * @author <a href="mailto:quanz@rizon.com.cn">James Quan</a>
 * @version Created at 2008-5-20 下午01:53:15
 */
public class Expression {
	/**
	 * 值类型的条件定义，表示所定义的条件为属性与值之间的关系，此时value中所定义的为属性值
	 */
	public static final String EXPRESSION_TYPE_VALUE = "value";
	/**
	 * 属性关系类型的条件定义，表示所定义的条件为属性与属性之间的关系，此时value中所定义的为另一属性名字
	 */
	public static final String EXPRESSION_TYPE_PROPERTY = "property";
	/**
	 * sql类型的条件定义，表示所定义的条件为查询约束sql片段，此时value中所定义的为sql片段
	 */
	public static final String EXPRESSION_TYPE_SQL = "sql";
	/**
	 * 条件组合类型的条件定义，表示所定义的条件为条件与条件之间的组合关系，此时value中所定义的为待组合的条件集合
	 */
	public static final String EXPRESSION_TYPE_GROUP = "group";

	private String type = EXPRESSION_TYPE_VALUE;
	private String name;
	private String op;
	private Object value;

	public Expression(String name, String op, Object value) {
		super();
		this.name = name;
		this.op = op;
		this.value = value; 
	}

	public Expression() {
		super();
	}

	/**
	 * 返回查询定义的类型，类型必须是{@link #EXPRESSION_TYPE_VALUE},
	 * {@link #EXPRESSION_TYPE_PROPERTY},{@link #EXPRESSION_TYPE_SQL}或
	 * {@link #EXPRESSION_TYPE_GROUP}
	 * 
	 * @return
	 */
	public String getType() {
		return type == null ? EXPRESSION_TYPE_VALUE : type;
	}

	/**
	 * 设置查询定义的类型，类型必须是{@link #EXPRESSION_TYPE_VALUE},
	 * {@link #EXPRESSION_TYPE_PROPERTY},{@link #EXPRESSION_TYPE_SQL}或
	 * {@link #EXPRESSION_TYPE_GROUP}
	 * 
	 * @param type
	 */
	public void setType(String type) {
		this.type = type;
	}

	/**
	 * 返回查询的属性名字
	 * 
	 * @return
	 */
	public String getName() {
		return name;
	}

	/**
	 * 设置查询的属性名字
	 * 
	 * @param name
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * 返回查询条件类型
	 * 
	 * @return
	 */
	public String getOp() {
		return op;
	}

	/**
	 * 设置查询条件类型
	 * 
	 * @param op
	 */
	public void setOp(String op) {
		this.op = op;
	}

	/**
	 * 返回查询的条件值
	 * 
	 * @return
	 */
	public Object getValue() {
		return value;
	}

	/**
	 * 设置查询的条件值
	 * 
	 * @param value
	 */
	public void setValue(Object value) {
		this.value = value;
	}

	/**
	 * 返回字符形式的查询条件值
	 * 
	 * @return
	 */
	public String getStringValue() {
		return (String) value;
	}

	/**
	 * 设置字符形式的查询条件值
	 * 
	 * @param value
	 */
	public void setStringValue(String value) {
		this.value = value;
	}

	/**
	 * 返回短整型形式的查询条件值
	 * @return
	 */
	public short getShortValue() {
		return value == null ? (short) -1 : ((Short) value).shortValue();
	}
	
	/**
	 * 设置短整型形式的查询条件值
	 * @param value
	 */
	public void setShortValue(short value) {
		this.value = value;
	}

	/**
	 * 返回整数形式的查询条件值
	 * 
	 * @return
	 */
	public int getIntValue() {
		return value == null ? -1 : ((Integer) value).intValue();
	}

	/**
	 * 设置整数形式的查询条件值
	 * 
	 * @param value
	 */
	public void setIntValue(int value) {
		this.value = value;
	}

	/**
	 * 返回长整数形式的查询条件值(javascript无法接收完整范围的长整型数字，只能以字符方式传输) 
	 * 
	 * @return
	 */
	public String getLongValue() {
		return value == null ? "-1" : ((Long) value).toString();
	}

	/**
	 * 设置长整数形式的查询条件值(javascript无法接收完整范围的长整型数字，只能以字符方式传输)
	 * 
	 * @param value
	 */
	public void setLongValue(String value) {
		this.value = Long.parseLong(value);
	}

	/**
	 * 返回浮点数形式的查询条件值
	 * 
	 * @return
	 */
	public float getFloatValue() {
		return value == null ? -1 : ((Float) value).floatValue();
	}

	/**
	 * 设置浮点数形式的查询条件值
	 * 
	 * @param value
	 */
	public void setFloatValue(float value) {
		this.value = value;
	}

	/**
	 * 返回双精度数形式的查询条件值
	 * 
	 * @return
	 */
	public double getDoubleValue() {
		return value == null ? -1 : ((Double) value).doubleValue();
	}

	/**
	 * 设置双精度数形式的查询条件值
	 * 
	 * @param value
	 */
	public void setDoubleValue(double value) {
		this.value = value;
	}

	/**
	 * 返回条件集合形式的查询条件值
	 * 
	 * @return
	 */
	public Expression[] getExpValue() {
		return (Expression[]) value;
	}

	/**
	 * 设置条件集合形式的查询条件值
	 * 
	 * @param value
	 */
	public void setExpValue(Expression[] value) {
		this.type = EXPRESSION_TYPE_GROUP;
		this.value = value;
	}

	/**
	 * 返回布尔值形式的查询条件值
	 * 
	 * @return
	 */
	public boolean getBooleanValue() {
		return value == null ? false : ((Boolean) value).booleanValue();
	}

	/**
	 * 设置布尔值形式的查询条件值
	 * 
	 * @param value
	 */
	public void setBooleanValue(boolean value) {
		this.value = value;
	}

	/**
	 * 返回日期值形式的查询条件值
	 * 
	 * @return
	 */
	public Date getDateValue() {
		return (Date) value;
	}

	/**
	 * 设置日期值形式的查询条件值
	 * 
	 * @param value
	 */
	public void setDateValue(Date value) {
		this.value = value;
	}
	

	/**
	 * 返回{@link DateTime}形式的查询条件值
	 * 
	 * @return
	 */
	public DateTime getDateTimeValue() {
		return (DateTime) value;
	}

	/**
	 * 设置{@link DateTime}形式的查询条件值
	 * 
	 * @param value
	 */
	public void setDateTimeValue(DateTime value) {
		this.value = value;
	}
}